home *** CD-ROM | disk | FTP | other *** search
-
- /*
- * (a) (C) 1990 by Adobe Systems Incorporated. All rights reserved.
- *
- * (b) If this Sample Code is distributed as part of the Display PostScript
- * System Software Development Kit from Adobe Systems Incorporated,
- * then this copy is designated as Development Software and its use is
- * subject to the terms of the License Agreement attached to such Kit.
- *
- * (c) If this Sample Code is distributed independently, then the following
- * terms apply:
- *
- * (d) This file may be freely copied and redistributed as long as:
- * 1) Parts (a), (d), (e) and (f) continue to be included in the file,
- * 2) If the file has been modified in any way, a notice of such
- * modification is conspicuously indicated.
- *
- * (e) PostScript, Display PostScript, and Adobe are registered trademarks of
- * Adobe Systems Incorporated.
- *
- * (f) THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO
- * CHANGE WITHOUT NOTICE, AND SHOULD NOT BE CONSTRUED
- * AS A COMMITMENT BY ADOBE SYSTEMS INCORPORATED.
- * ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY
- * OR LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO
- * WARRANTY OF ANY KIND (EXPRESS, IMPLIED OR STATUTORY)
- * WITH RESPECT TO THIS INFORMATION, AND EXPRESSLY
- * DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT
- * OF THIRD PARTY RIGHTS.
- */
-
- /*
- * ScrollApp.m
- *
- * This subclass of the application class performs the global
- * setup needed for the Scrolling application. The drawing
- * window is created.
- *
- * Version: 2.0
- * Author: Ken Anderson, Ken Fromm
- * History:
- * 03-07-91 Added this comment.
- */
-
- #import "ScrollApp.h"
- #import "DocView.h"
- #import "DrawingView.h"
- #import "DrawingViewWraps.h"
- #import "EpsfParser.h"
- #import <objc/hashtable.h> /* for NXCopyStringBuffer() */
- #import <appkit/Button.h>
- #import <appkit/Matrix.h>
- #import <appkit/OpenPanel.h>
- #import <appkit/ScrollView.h>
- #import <appkit/Window.h>
- #import <appkit/nextstd.h>
- #import <sys/param.h>
- #import <string.h>
-
- static NXRect windowRect = {150, 184, 550, 600};
-
- @implementation ScrollApp
-
- /*
- * Allocate the memory for the user path description buffers. Create the
- * window for drawing the image.
- */
- + new
- {
- self = [super new];
-
- NX_MALLOC(drawBuffer.pts, float, PTS_UPATH_BUFFER);
- NX_MALLOC(drawBuffer.ops, char, OPS_UPATH_BUFFER);
-
- windowBacking = NX_RETAINED;
-
- readerId = [EpsfParser new];
-
- [self createWindow:&windowRect];
-
- return self;
- }
-
- /*
- * Create the drawing window and place a scrollview as the content view.
- * A DrawingView instance is placed as the DocView of the ScrollView.
- */
- - createWindow:(NXRect *) winRect
- {
- NXRect tempRect;
-
- windowId = [Window newContent:winRect
- style:NX_TITLEDSTYLE
- backing:windowBacking
- buttonMask:NX_RESIZEBUTTONMASK
- defer:NO];
-
- [Window getContentRect:&tempRect forFrameRect:winRect style:NX_TITLEDSTYLE];
- scrollviewId = [ScrollView newFrame:&tempRect];
- [scrollviewId setBorderType:SCROLLVIEW_BORDER];
-
- drawingviewId = [[[DrawingView newFrame:&tempRect] setClipping:NO] allocateGState];
- docviewId = [[[[DocView new] setClipping:NO] allocateGState] setScale:1.0];
- [docviewId setDrawView:drawingviewId];
- [scrollviewId setDocView:docviewId];
-
- /*
- * Important in 2.0 because it eliminates a problem in 2.0 that shifts the halftonephase
- * over by 1 extra pixel, causing a noticable aberration in a halftone during a scroll.
- */
- [[[docviewId superview] setFlipped:NO] allocateGState];
-
- [[windowId setContentView:scrollviewId] free];
-
- [windowId makeFirstResponder:drawingviewId];
- [windowId setDelegate:self];
-
- return self;
- }
-
- /* The window will free the its subviews. */
- - free
- {
- if (drawBuffer.pts)
- NX_FREE(drawBuffer.pts);
- if (drawBuffer.ops)
- NX_FREE(drawBuffer.ops);
-
- [readerId free];
- [windowId free];
-
- return [super free];
- }
-
- - setMenuItem:anObject;
- {
- menuitemId = anObject;
-
- return self;
- }
-
- - setRedrawButton:anObject
- {
- redrawButton = anObject;
- methodsWindow = [redrawButton window];
-
- return self;
- }
-
- - redrawButton
- {
- return redrawButton;
- }
-
- - methodsWindow
- {
- return methodsWindow;
- }
-
- - setStatusMatrix:anObject
- {
- statusmatrixId = anObject;
-
- return self;
- }
-
- - getStatusMatrix
- {
- return statusmatrixId;
- }
-
- - setTimingMatrix:anObject
- {
- timingmatrixId = anObject;
-
- return self;
- }
-
- - getTimingMatrix
- {
- return timingmatrixId;
- }
-
- - setStrokingMatrix:anObject
- {
- strokingmatrixId = anObject;
-
- return self;
- }
-
- - getStrokingMatrix
- {
- return strokingmatrixId;
- }
-
- - setParameterMatrix:anObject
- {
- parametermatrixId = anObject;
-
- return self;
- }
-
- - getParameterMatrix
- {
- return parametermatrixId;
- }
-
- - setTypeOfDrawing:sender
- {
- [drawingviewId setTypeOfDrawing:sender];
-
- return self;
- }
-
- - setSelectivity:sender
- {
- [drawingviewId setSelectivity:sender];
-
- return self;
- }
-
- - setDrawingManner:sender
- {
- [drawingviewId setDrawingManner:sender];
-
- return self;
- }
-
- - setParameterSetting:sender
- {
- [drawingviewId setParameterSetting:sender];
-
- return self;
- }
-
- - setStroking:sender
- {
- [drawingviewId setStroking:sender];
-
- return self;
- }
-
- - setWindowBacking:sender
- {
- id newWindow, oldContentView, tempView;
-
- char *windowTitle;
-
- int newBacking;
-
- NXRect winFrame, contRect;
-
- if (!runningDrawModal)
- {
- if ([sender selectedRow] == 0)
- newBacking = NX_RETAINED;
- else
- newBacking = NX_BUFFERED;
-
- if (windowBacking != newBacking)
- {
- [windowId getFrame:&winFrame];
- [Window getContentRect:&contRect forFrameRect:&winFrame
- style:[windowId style]];
- newWindow = [Window newContent:&contRect
- style:NX_TITLEDSTYLE
- backing:newBacking
- buttonMask:NX_RESIZEBUTTONMASK
- defer:NO];
- [newWindow setTitle:[windowId title]];
- [newWindow display];
- [newWindow makeKeyAndOrderFront:self];
-
- [windowId disableDisplay];
- tempView = [View new];
- oldContentView = [windowId setContentView:tempView];
- [[newWindow setContentView:oldContentView] free];
- [windowId free];
-
- windowId = newWindow;
- [windowId makeFirstResponder:drawingviewId];
- [windowId setDelegate:self];
-
- windowBacking = newBacking;
- }
-
- if (currentfile)
- {
- [drawingviewId setFieldsMode:YES];
- [windowId display];
- [windowId makeKeyAndOrderFront:self];
- }
- }
-
- return self;
- }
-
- - showWindow:sender
- {
- if (currentfile)
- [windowId makeKeyAndOrderFront:self];
-
- return self;
- }
-
- /* This method changes the title of the menu cell according to the
- * value of the trace variable.
- */
- -setTracing:sender
- {
- if (trace == NO)
- [[sender selectedCell] setTitle:"Trace On"];
- else
- [[sender selectedCell] setTitle:"Trace Off"];
-
- trace = !trace;
-
- return self;
- }
-
- - (BOOL) tracing;
- {
- return trace;
- }
-
- - zoom:sender
- {
- [docviewId zoom:sender];
-
- return self;
- }
-
- - redrawAction:sender
- {
- if (!runningDrawModal)
- [redrawButton performClick:self];
-
- return self;
- }
-
- - redraw:sender
- {
- NXRect visRect;
-
- if (!runningDrawModal)
- {
- [drawingviewId setFieldsMode:YES];
- [drawingviewId getVisibleRect:&visRect];
- [drawingviewId display:&visRect :1];
- }
-
- return self;
- }
-
- - displayFields:sender
- {
- [drawingviewId displayFields:sender];
-
- return self;
- }
-
- - getDrawingView
- {
- return drawingviewId;
- }
-
- - getDocument
- {
- return docviewId;
- }
-
- - (UPath *) getUpathBuffer
- {
- return &drawBuffer;
- }
-
- /*
- * Called by pressing Load... in the Main menu.
- */
- - load:sender
- {
- id openpanelId, tempviewId, clipviewId;
-
- const char *file;
-
- static const char *const doctype[3] = {"ps", "eps", NULL};
-
- NXStream *stream;
-
- NXPoint viewPt, windowPt;
-
- NXRect epsfBounds, viewFrame;
-
- openpanelId = [[OpenPanel new] allowMultipleFiles:NO];
-
- if ([openpanelId runModalForTypes:doctype])
- {
- file = [openpanelId filename];
- if (!currentfile || strcmp(file, currentfile))
- {
- stream = NXMapFile(file, NX_READONLY);
- if (stream)
- {
- tempviewId = [View new];
- [windowId setContentView:tempviewId];
- [self setName:file withParsing:YES];
- [windowId display];
- [windowId makeKeyAndOrderFront:self];
- NXPing();
- [[windowId setContentView:scrollviewId] free];
-
- if ([readerId readPSFromStream:stream])
- {
- [docviewId scaleView:drawingviewId withScale:1.0];
- [docviewId setScale:1.0];
- [[docviewId zoomControl] selectCellWithTag:100];
-
- [readerId getBounds:&epsfBounds];
- [drawingviewId setDrawOrigin:&epsfBounds.origin];
- [drawingviewId sizeTo:epsfBounds.size.width :epsfBounds.size.height];
-
- [self setName:file withParsing:NO];
- if (currentfile)
- NX_FREE(currentfile);
- currentfile = NXCopyStringBuffer(file);
-
- [windowId disableDisplay];
- [docviewId placeView:drawingviewId];
-
- /* Scroll center of image to center of window. */
- [docviewId getFrame:&viewFrame];
- viewPt.x = viewFrame.size.width/2;
- viewPt.y = viewFrame.size.height/2;
- [drawingviewId convertPoint:&viewPt
- fromView:docviewId];
-
- [scrollviewId getFrame:&viewFrame];
- windowPt.x = viewFrame.size.width/2;
- windowPt.y = viewFrame.size.height/2;
- [scrollviewId convertPoint:&windowPt toView:nil];
-
- [docviewId scrollPoint:&viewPt
- inView:drawingviewId to:&windowPt];
- [windowId reenableDisplay];
-
- [drawingviewId setFieldsMode:YES];
- [windowId display];
- }
- else
- {
- [self setName:currentfile withParsing:NO];
- [windowId display];
- }
-
- NXCloseMemory(stream, NX_FREEBUFFER);
- }
- else
- NXRunAlertPanel("Load File", "Invalid File. Cannot open.",
- "OK", NULL, NULL);
- }
- }
-
- return self;
- }
-
- /*
- * Updates the name and directory of the document.
- */
- - setName:(const char *)filename withParsing:(BOOL) flag
- {
- int len = 0;
-
- char title[MAXPATHLEN+5];
-
- char *simple_filename;
-
- if (filename && *filename)
- {
- if (flag)
- strcpy(title, "parsing:");
- else
- title[0] = 0;
-
- simple_filename = strrchr(filename, '/');
- if (simple_filename)
- {
- len = strlen(simple_filename);
- simple_filename++;
- strcat(title, simple_filename);
- strcat(title, " \320 "); /* \320 is a "long dash" */
- strcatn(title, filename, strlen(filename) - len);
- }
- else
- strcat(title, filename);
-
- [windowId setTitle:title];
- [menuitemId setEnabled:YES];
- }
- else
- [windowId setTitle:"Scrolling"];
-
- return self;
- }
-
- /*
- * Resizes the doc view and repositions the drawing view inside the doc view.
- */
- - windowDidResize:sender
- {
- [docviewId placeView:drawingviewId];
-
- return self;
- }
-
- - (int) runDrawModalSession:(NXModalSession *) session
- {
- int returnCode1, returnCode2;
-
- NXPoint pt;
-
- NXEvent *anEvent;
-
- runningDrawModal = YES;
- returnCode1 = NX_RUNCONTINUES;
- while (anEvent = [NXApp getNextEvent:NX_MOUSEDOWNMASK waitFor:0
- threshold:NX_RUNMODALTHRESHOLD])
- {
- if (anEvent->window == [methodsWindow windowNum])
- {
- redrawButton = [NXApp redrawButton];
- pt = anEvent->location;
- [[redrawButton superview] convertPoint:&pt fromView:nil];
- if ([redrawButton hitTest:&pt] == redrawButton)
- {
- [redrawButton performClick:self];
- returnCode1 = NX_RUNABORTED;
- }
- }
- }
-
- returnCode2 = [self runModalSession:session];
- runningDrawModal = NO;
-
- if (returnCode1 == NX_RUNABORTED)
- return returnCode1;
- else
- return returnCode2;
- }
-
- @end
-
-